/******************************************************************************
  Copyright (C), 2004-2050, Hisilicon Tech. Co., Ltd.
******************************************************************************
  File Name     : hisi_wifi_shell.c
  Version       : Initial Draft
  Author        : Hisilicon WiFi software group
  Created       : 2016-3-22
  Last Modified :
  Description   : shell cmd
  Function List :
  History       :
  1.Date        : 2016-3-22
  Author        :
  Modification  : Created file
******************************************************************************/


#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif
#endif


/*****************************************************************************
  1 头文件包含
*****************************************************************************/

#include "wpa_supplicant/wpa_supplicant.h"
#include "linux/kernel.h"
#include "shell.h"
#include "driver_hisi_lib_api.h"
#include "los_event.h"
#include "los_task.h"
#include "stdio.h"
#include "lwip/netif.h"
#include "src/common/defs.h"
#include "hostapd/hostapd_if.h"
#include "driver_hisi_lib_api.h"


/*****************************************************************************
  2 全局变量定义
*****************************************************************************/

#ifdef CONFIG_NO_CONFIG_WRITE
    /* 无文件系统，通过全局变量配置参数 */
    struct     hostapd_conf     gst_hapd_conf = {0};
#else
    /* 采用文件系统配置参数 */
    #define HOSTAPD_CONF_PATH           "/config/etc/hisi_wifi/wifi/hostapd.conf"
    #define WPA_SUPPLICANT_CONFIG_PATH  "/config/etc/hisi_wifi/wifi/wpa_supplicant.conf"
#endif

/*****************************************************************************
  3 函数实现
*****************************************************************************/
#ifndef WIN32

#define ALTX_PARA_NUM 4
#define ALTX_PARA_LEN 20
#define ALRX_PARA_NUM 3
#define ALRX_PARA_LEN 20

void hisi_cmd_set_macaddr(int argc, char *argv[])
{
#define ETH_ALEN    6
    unsigned char   auc_macaddr[ETH_ALEN] = {0};
    unsigned char   uc_loop;

    for (uc_loop = 0; uc_loop < ETH_ALEN; uc_loop++)
    {
        auc_macaddr[uc_loop] = (unsigned char)strtol(argv[uc_loop], NULL, 16);
    }

    auc_macaddr[0] &= 0xFE;         // mac地址该位不能为1，否则会影响业务收发
    hisi_set_macaddr(&auc_macaddr);
}

void hisi_cmd_dc_test(int argc, char *argv[])
{
    if (argc != 3)
    {
        dprintf("hisi_cmd_dc_test para error\n");
        return;
    }

    hisi_wlan_dc_test(atoi(argv[0]), argv[1], argv[2]);
}

/*****************************************************************************
 函 数 名  :hisi_cmd_set_always_tx
 功能描述  :设置国家码
 输入参数  :
 输出参数  :
 返 回 值  :
 调用函数  :
 被调函数  :

 修改历史      :
  1.日    期   :2017年01月19日
    作    者   :
    修改内容   : 新生成函数

*****************************************************************************/
void hisi_cmd_set_always_tx(int argc, unsigned char *argv[])
{
    unsigned int    ul_index;
    char            ac_buffer[ALTX_PARA_NUM][ALTX_PARA_LEN] = {0};
    int             l_ret;

    if (argc != ALTX_PARA_NUM)
    {
        HISI_PRINT_ERROR("arg nums not right\n");
        HISI_PRINT_ERROR("FAIL!\n");
        return;
    }

    for (ul_index = 0; ul_index < ALTX_PARA_NUM; ul_index++)
    {
        strcpy(ac_buffer[ul_index], argv[ul_index]);
    }

    l_ret = hisi_wlan_set_always_tx((char *)ac_buffer);
    if (l_ret)
    {
        HISI_PRINT_ERROR("tx err code is %d\n", l_ret);
        HISI_PRINT_ERROR("FAIL!\n");
    }
    else
    {
        HISI_PRINT_ERROR("OK!\n");
    }
    return;

}

/*****************************************************************************
 函 数 名  :hisi_cmd_set_always_rx
 功能描述  :设置国家码
 输入参数  :
 输出参数  :
 返 回 值  :
 调用函数  :
 被调函数  :

 修改历史      :
  1.日    期   :2017年01月19日
    作    者   :
    修改内容   : 新生成函数

*****************************************************************************/
void hisi_cmd_set_always_rx(int argc, unsigned char *argv[])
{
    unsigned int    ul_index;
    char            ac_buffer[ALRX_PARA_NUM][ALRX_PARA_LEN] = {0};
    int             l_ret;

    if (argc != ALRX_PARA_NUM)
    {
        HISI_PRINT_ERROR("arg nums not right\n");
        HISI_PRINT_ERROR("FAIL!\n");

        return;
    }

    for (ul_index = 0; ul_index < ALRX_PARA_NUM; ul_index++)
    {
        strcpy(ac_buffer[ul_index], argv[ul_index]);
    }

    l_ret = hisi_wlan_set_always_rx((char *)ac_buffer);
    if (l_ret)
    {
        HISI_PRINT_ERROR("rx err code is %d\n", l_ret);
        HISI_PRINT_ERROR("FAIL!\n");
    }
    else
    {
        HISI_PRINT_ERROR("OK!\n");
    }

    return ;
}


/*****************************************************************************
 函 数 名  :hisi_cmd_rx_info
 功能描述  :查看常收收包数
 输入参数  :
 输出参数  :
 返 回 值  :
 调用函数  :
 被调函数  :

 修改历史      :
  1.日    期   :2017年01月19日
    作    者   :
    修改内容   : 新生成函数

*****************************************************************************/
void hisi_cmd_rx_info(void)
{
    int l_rx_succ_num = -1;
    if (HISI_SUCC != hisi_wlan_rx_fcs_info(&l_rx_succ_num))
    {
         HISI_PRINT_ERROR("fx_info faile");
    }

    HISI_PRINT_ERROR("succ num [%d]", l_rx_succ_num);
    return;
}

/*****************************************************************************
 函 数 名  :hisi_set_country
 功能描述  :设置国家码
 输入参数  :
 输出参数  :
 返 回 值  :
 调用函数  :
 被调函数  :

 修改历史      :
  1.日    期   :2017年01月19日
    作    者   :
    修改内容   : 新生成函数

*****************************************************************************/
void hisi_cmd_set_country(int argc, unsigned char *argv[])
{
    unsigned char *p_uc_country;

    p_uc_country = argv[0];
    if (NULL == p_uc_country)
    {
        HISI_PRINT_ERROR("hisi_cmd_set_country::point is NULL");
        return;
    }

    if (HISI_SUCC != hisi_wlan_set_country(p_uc_country))
    {
        HISI_PRINT_ERROR("hisi_cmd_set_country::set country faile!");
        return;
    }

    HISI_PRINT_ERROR("hisi_cmd_set_country::set country succ!");
    return;
}



/*****************************************************************************
 函 数 名  :hisi_set_country
 功能描述  :获取国家码
 输入参数  :
 输出参数  :
 返 回 值  :
 调用函数  :
 被调函数  :

 修改历史      :
  1.日    期   :2017年01月19日
    作    者   :
    修改内容   : 新生成函数

*****************************************************************************/
void hisi_cmd_get_country(void)
{
    char *pc_country = hisi_wlan_get_country();
    if (NULL == pc_country)
    {
       HISI_PRINT_ERROR("hisi_cmd_get_country::get country faile!");
       return;
    }

    HISI_PRINT_ERROR("country is %c%c", pc_country[0], pc_country[1]);
    return;
}

/*****************************************************************************
 函 数 名  :hisi_cmd_get_channel
 功能描述  :获取信道
 输入参数  :
 输出参数  :
 返 回 值  :
 调用函数  :
 被调函数  :

 修改历史      :
  1.日    期   :2017年01月19日
    作    者   :
    修改内容   : 新生成函数

*****************************************************************************/
void hisi_cmd_get_channel(void)
{
    hisi_channel_stru channel_info;
    if (HISI_SUCC != hisi_wlan_get_channel(&channel_info))
    {
        HISI_PRINT_ERROR("get_channel_fail");
        return;
    }

    HISI_PRINT_ERROR("channel[%d], bandwith[%d]", channel_info.uc_channel_num, channel_info.uc_channel_bandwidth);

    return;
}



/*****************************************************************************
 函 数 名  :hisi_cmd_set_pm_switch
 功能描述  :设置低功耗开关
 输入参数  :
 输出参数  :
 返 回 值  :
 调用函数  :
 被调函数  :

 修改历史      :
  1.日    期   :2017年01月19日
    作    者   :
    修改内容   : 新生成函数

*****************************************************************************/
void hisi_cmd_set_pm_switch(int argc, unsigned char *argv[])
{
    unsigned int pm_switch_value;
    pm_switch_value =  (int)strtol(argv[0], NULL, 16);

    /*获取低功耗开关状态*/
    if ((0 != pm_switch_value) && (1 != pm_switch_value))
    {
        HISI_PRINT_ERROR("parama is error, please check!");
        return ;
    }

    /*下发低功耗状态*/
    if (HISI_SUCC != hisi_wlan_set_pm_switch(pm_switch_value))
    {
        HISI_PRINT_ERROR("pm switch set faile");
        return;
    }

    HISI_PRINT_ERROR("pm switch set succ");
    return;
}
/*****************************************************************************
 函 数 名  :hisi_cmd_get_station
 功能描述  :获取station信息
 输入参数  :
 输出参数  :
 返 回 值  :
 调用函数  :
 被调函数  :

 修改历史      :
  1.日    期   :
    作    者   :
    修改内容   : 新生成函数

*****************************************************************************/

void hisi_cmd_get_station(void)
{
    struct station_info st_sta ;

    /*获取station信息*/
    if (HISI_SUCC != hisi_wlan_get_station(&st_sta))
    {
        HISI_PRINT_ERROR("get station info fail!");
        return;
    }

    HISI_PRINT_ERROR("get station info succ!");
    HISI_PRINT_ERROR("rssi = %d,tx rate = %d/10 Mbps\n",st_sta.l_signal,st_sta.l_txrate);

    return;
}

#endif

const char *cmd_start_hapd_Help =
"\nUsage:\n"
"\tstart_hapd <ssid_name> <security_mode> <encryption> <security_key>\n"
"\tchannel    : Channel number\n"
"\tessid      : Name of access point\n"
"\thiddenssid : properties of ssid hidden\n"
"\tsecurity   : [none] [wep-open] [wep-shared] [wpa] [wpa2] [wpa+wpa2]\n"
"\tencryption : [tkip] [aes] [tkip+aes]-For WPA/WPA2 and key index for WEP\n"
"\tkey        : Passphrase / WEP Key\n"
"\nExample:\n"
"\tstart_hapd 9 softap 0 none\t(Connect with AP 'softap' in open authentication)\n"
"\tstart_hapd 9 softap 1 wep_open 0 wepkey\t(Connect with AP 'softap' in wep open mode with key index 0 and key value of 'wpakey')\n"
"\tstart_hapd 9 softap 2 wpa2 tkip wepkey\t(Connect with AP 'softap' in WPA2 mode in tkip encryption with key value of 'wpakey')\n";

#ifdef CONFIG_NO_CONFIG_WRITE
extern int use_hostapd;
/*****************************************************************************
 函 数 名  : cmd_start_hapd
 功能描述  : 无文件系统，通过shell命令启动hostapd
 输入参数  : oal_int32 argc
             oal_int8 *argv[]
 输出参数  : 无
 返 回 值  : OAL_STATIC oal_void
 调用函数  :
 被调函数  :

 修改历史      :
  1.日    期   : 2016年3月22日
    作    者   : 
    修改内容   : 新生成函数

*****************************************************************************/
void cmd_start_hapd(int argc, unsigned char *argv[])
{
    ip4_addr_t           st_gw;
    ip4_addr_t           st_ipaddr;
    ip4_addr_t           st_netmask;
    struct netif       *pst_lwip_netif;
    unsigned char      *puc_encipher_mode;
    unsigned char      *puc_beacon_int = NULL;
    /* 正常启动时恢复hisi_link状态 */
    hsl_demo_set_status(0);
    memset(&gst_hapd_conf, 0, sizeof(struct hostapd_conf));

    IP4_ADDR(&st_gw, 192, 168, 43, 1);
    IP4_ADDR(&st_ipaddr, 192, 168, 43, 1);
    IP4_ADDR(&st_netmask, 255, 255, 255, 0);

    pst_lwip_netif = netif_find("wlan0");
    if (HISI_NULL == pst_lwip_netif)
    {
        HISI_PRINT_ERROR("cmd_start_hapd::Null param of netdev");
        return;
    }

    if (1 == use_hostapd)
    {
        HISI_PRINT_INFO("cmd_start_hapd::hostapd is allready started!");
        return;
    }
    memcpy(gst_hapd_conf.driver, "hisi", 5);
    gst_hapd_conf.channel_num = atoi(argv[0]);
    memcpy(gst_hapd_conf.ssid, argv[1], 32);
    gst_hapd_conf.ignore_broadcast_ssid = atoi(argv[2]);
    memcpy(gst_hapd_conf.ht_capab, argv[3], strlen(argv[3]));

    puc_encipher_mode = argv[4];

    if (!strcmp(puc_encipher_mode, "none"))
    {
        gst_hapd_conf.authmode = HOSTAPD_SECURITY_OPEN;
        if (6 == argc)
        {
            puc_beacon_int = argv[5];
        }
    }
    else if (!strcmp(puc_encipher_mode, "wpa"))
    {
        gst_hapd_conf.authmode = HOSTAPD_SECURITY_WPAPSK;
    }
    else if (!strcmp(puc_encipher_mode, "wpa2"))
    {
        gst_hapd_conf.authmode = HOSTAPD_SECURITY_WPA2PSK;
    }
    else if (!strcmp(puc_encipher_mode, "wpa+wpa2"))
    {
        gst_hapd_conf.authmode = HOSTAPD_SECURITY_WPAPSK_WPA2PSK_MIX;
    }
    else
    {
        HISI_PRINT_WARNING("Invalid security");
        HISI_PRINT_WARNING("%s", cmd_start_hapd_Help);
        return;
    }

    if (gst_hapd_conf.authmode != HOSTAPD_SECURITY_OPEN)
    {
        if (7 > argc)
        {
            HISI_PRINT_WARNING("Invalid argc");
            HISI_PRINT_WARNING("%s", cmd_start_hapd_Help);
            return;
        }
        strcpy((char *)gst_hapd_conf.key, argv[6]);
        if (8 == argc)
        {
            puc_beacon_int = argv[7];
        }
    }

    if (HOSTAPD_SECURITY_WPAPSK == gst_hapd_conf.authmode ||
        HOSTAPD_SECURITY_WPA2PSK == gst_hapd_conf.authmode ||
        HOSTAPD_SECURITY_WPAPSK_WPA2PSK_MIX == gst_hapd_conf.authmode)
    {
        puc_encipher_mode = argv[5];
        if (!strcmp(puc_encipher_mode, "tkip"))
        {
            gst_hapd_conf.wpa_pairwise = WPA_CIPHER_TKIP;
        }
        else if (!strcmp(puc_encipher_mode, "aes"))
        {
            gst_hapd_conf.wpa_pairwise = WPA_CIPHER_CCMP;
        }
        else if (!strcmp(puc_encipher_mode, "tkip+aes"))
        {
            gst_hapd_conf.wpa_pairwise = WPA_CIPHER_TKIP | WPA_CIPHER_CCMP;
        }
        else
        {
            HISI_PRINT_WARNING("Invalid encryption");
            HISI_PRINT_WARNING("%s", cmd_start_hapd_Help);
            return;
        }
    }

    /* 重新设置netif的网关和mac地址，防止STA切AP时，没有还原 */
    netifapi_netif_set_addr(pst_lwip_netif, &st_ipaddr, &st_netmask, &st_gw);
    if (NULL != puc_beacon_int)
    {
        gst_hapd_conf.beacon_int = atoi(puc_beacon_int);
    }

    if (HISI_SUCC != hostapd_start(HISI_NULL, &gst_hapd_conf))
    {
        HISI_PRINT_ERROR("hostapd start failed");
        return;
    }

    HISI_PRINT_INFO("hostapd start succ");

    use_hostapd = 1;
    return;
}

#else

/*****************************************************************************
 函 数 名  : cmd_start_hapd
 功能描述  : 通过文件系统启动hostapd
 输入参数  : oal_void
 输出参数  : 无
 返 回 值  : oal_void
 调用函数  :
 被调函数  :

 修改历史      :
  1.日    期   : 2016年7月26日
    作    者   : 
    修改内容   : 新生成函数

*****************************************************************************/
void cmd_start_hapd(void)
{
    ip4_addr_t        st_gw;
    ip4_addr_t        st_ipaddr;
    ip4_addr_t        st_netmask;
    struct netif    *pst_lwip_netif;

    IP4_ADDR(&st_gw, 192, 168, 43, 1);
    IP4_ADDR(&st_ipaddr, 192, 168, 43, 1);
    IP4_ADDR(&st_netmask, 255, 255, 255, 0);

    pst_lwip_netif = netif_find("wlan0");
    if (HISI_NULL == pst_lwip_netif)
    {
        HISI_PRINT_ERROR("cmd_start_hapd::Null param of netdev");
        return;
    }

    /* 重新设置netif的网关和mac地址，防止STA切AP时，没有还原 */
    netifapi_netif_set_addr(pst_lwip_netif, &st_ipaddr, &st_netmask, &st_gw);

    if (HISI_SUCC != hostapd_start(HOSTAPD_CONF_PATH, NULL))
    {
        HISI_PRINT_ERROR("hostapd start failed");
        return;
    }

    HISI_PRINT_INFO("hostapd start succ");

    return;
}
#endif

/*****************************************************************************
 函 数 名  : cmd_stop_hapd
 功能描述  : 启动hostapd命令
 输入参数  : oal_void
 输出参数  : 无
 返 回 值  : OAL_STATIC oal_void
 调用函数  :
 被调函数  :

 修改历史      :
  1.日    期   : 2016年5月5日
    作    者   : 
    修改内容   : 新生成函数

*****************************************************************************/
void cmd_stop_hapd(void)
{
    struct netif         *pst_lwip_netif;
    if (HISI_SUCC != hostapd_stop())
    {
        HISI_PRINT_WARNING("hostapd stop failed");
        return;
    }

    pst_lwip_netif = netif_find("wlan0");
    if (NULL == pst_lwip_netif)
    {
        dprintf("cmd_stop_hapd netif_find wlan0 fail\n");
        return;
    }
    netifapi_dhcps_stop(pst_lwip_netif);
    netifapi_netif_set_down(pst_lwip_netif);
    hisi_wlan_ip_notify(HISI_AP_MODE, HISI_DHCP_IP_DEL);
}

/*****************************************************************************
 函 数 名  : cmd_wpa_start
 功能描述  : 启动wpa_supplicant
 输入参数  :
 输出参数  :
 返 回 值  :
 调用函数  :
 被调函数  :

 修改历史      :
  1.日    期   : 2016年6月29日
    作    者   : 
    修改内容   : 新生成函数

*****************************************************************************/


void cmd_wpa_start(int argc, char *argv[])
{
    int l_ret = 0;

    /* 正常启动时恢复hisi_link状态 */
    hsl_demo_set_status(0);
#ifdef CONFIG_NO_CONFIG_WRITE
    l_ret = wpa_supplicant_start("wlan0", "hisi", NULL);
#else
    l_ret = wpa_supplicant_start("wlan0", "hisi", WPA_SUPPLICANT_CONFIG_PATH);
#endif

    if (l_ret != HISI_SUCC)
    {
        HISI_PRINT_ERROR("cmd_wpa_start fail.");
        return;
    }
}
/*****************************************************************************
 函 数 名  : cmd_wpa_stop
 功能描述  : 停止wpa_supplicant
 输入参数  :
 输出参数  :
 返 回 值  :
 调用函数  :
 被调函数  :

 修改历史      :
  1.日    期   : 2016年6月29日
    作    者   : 
    修改内容   : 新生成函数

*****************************************************************************/

void cmd_wpa_stop(int argc, char *argv[])
{
    ip4_addr_t        st_gw;
    ip4_addr_t        st_ipaddr;
    ip4_addr_t        st_netmask;
    struct netif    *pst_lwip_netif;

    int l_ret = 0;
    l_ret = wpa_supplicant_stop();
    if (l_ret != HISI_SUCC)
    {
        HISI_PRINT_WARNING("cmd_wpa_stop fail.");
        return;
    }

    IP4_ADDR(&st_gw, 0, 0, 0, 0);
    IP4_ADDR(&st_ipaddr, 0, 0, 0, 0);
    IP4_ADDR(&st_netmask, 0, 0, 0, 0);

    pst_lwip_netif = netif_find("wlan0");
    if (HISI_NULL == pst_lwip_netif)
    {
        HISI_PRINT_ERROR("cmd_start_hapd::Null param of netdev");
        return;
    }

    netifapi_dhcp_stop(pst_lwip_netif);
    netifapi_netif_set_down(pst_lwip_netif);

    /* wpa_stop后，重新设置netif的网关和mac地址 */
    netifapi_netif_set_addr(pst_lwip_netif, &st_ipaddr, &st_netmask, &st_gw);
}
/*****************************************************************************
 函 数 名  : cmd_wpa_scan
 功能描述  : 发起关联
 输入参数  :
 输出参数  :
 返 回 值  :
 调用函数  :
 被调函数  :

 修改历史      :
  1.日    期   : 2016年6月29日
    作    者   : 
    修改内容   : 新生成函数

*****************************************************************************/

void cmd_wpa_scan(int argc, char *argv[])
{
    int l_ret = 0;

    l_ret = wpa_cli_scan();
    if (l_ret != 0)
    {
        HISI_PRINT_WARNING("cmd_wpa_scan fail.");
    }
}

void cmd_wpa_channel_scan(int argc, char *argv[])
{
    int l_ret = 0;
    int channel;

    channel = atoi(argv[0]);
    l_ret = wpa_cli_channel_scan(channel);
    if (l_ret != 0)
    {
        HISI_PRINT_WARNING("cmd_wpa_channel_scan fail.");
    }
}

/*****************************************************************************
 函 数 名  : cmd_wpa_scan_results
 功能描述  : 获取扫描结果
 输入参数  :
 输出参数  :
 返 回 值  :
 调用函数  :
 被调函数  :

 修改历史      :
  1.日    期   : 2016年6月29日
    作    者   : 
    修改内容   : 新生成函数

*****************************************************************************/
void cmd_wpa_scan_results(int argc, char *argv[])
{
#define SCAN_AP_LIMIT            64

    struct wpa_ap_info *pst_results = HISI_NULL;
    unsigned int   num = SCAN_AP_LIMIT ;
    unsigned int   ul_loop;

    pst_results = malloc(sizeof(struct wpa_ap_info) * SCAN_AP_LIMIT);

    if(HISI_NULL == pst_results)
    {
          printf("cmd_wpa_scan_results, OAL_PTR_NULL == pst_results\n");
          return;
    }

    memset(pst_results, 0, (sizeof(struct wpa_ap_info) * SCAN_AP_LIMIT));
    wpa_cli_scan_results(pst_results,&num);

    for (ul_loop = 0; (ul_loop < num) && (ul_loop < SCAN_AP_LIMIT); ul_loop++)
    {
        printf("<------------------------>");
        HISI_PRINT_WARNING("<------------------------>");
        printf("ssid:%s\n",pst_results[ul_loop].ssid);
        HISI_PRINT_WARNING("ssid:%s",pst_results[ul_loop].ssid);
        printf("bssid:%s\n",pst_results[ul_loop].bssid);
        HISI_PRINT_WARNING("bssid:%s",pst_results[ul_loop].bssid);
        printf("channel:%d\n",pst_results[ul_loop].channel);
        HISI_PRINT_WARNING("channel:%d",pst_results[ul_loop].channel);
        printf("rssi:%d\n",pst_results[ul_loop].rssi/100);
        HISI_PRINT_WARNING("rssi:%d",pst_results[ul_loop].rssi/100);
        switch(pst_results[ul_loop].auth)
        {
            case WPA_SECURITY_OPEN:
            printf("auth type: open\n");
            HISI_PRINT_WARNING("auth type: open");
            break;
            case WPA_SECURITY_WEP:
            printf("auth type: wep\n");
            HISI_PRINT_WARNING("auth type: wep");
            break;
            case WPA_SECURITY_WPAPSK:
            printf("auth type: wpa\n");
            HISI_PRINT_WARNING("auth type: wpa");
            break;
            case WPA_SECURITY_WPA2PSK:
            printf("auth type: wpa2\n");
            HISI_PRINT_WARNING("auth type: wpa2");
            break;
            case WPA_SECURITY_WPAPSK_WPA2PSK_MIX:
            printf("auth type: wpa+wpa2\n");
            HISI_PRINT_WARNING("auth type: wpa+wpa2");
            break;
            default:
            printf("auth type error\n");
            HISI_PRINT_WARNING("auth type error");
            break;
        }
    }

    free(pst_results);
    pst_results = HISI_NULL;
}

/*****************************************************************************
 函 数 名  : wpa_connect_interface
 功能描述  : 发起关联
 输入参数  :
 输出参数  :
 返 回 值  :
 调用函数  :
 被调函数  :

 修改历史      :
  1.日    期   : 2016年6月29日
    作    者   : 
    修改内容   : 新生成函数

*****************************************************************************/

void wpa_connect_interface(struct wpa_assoc_request * pst_wpa_assoc_req)
{
    wpa_cli_connect(pst_wpa_assoc_req);

    HISI_PRINT_INFO("Authentication:%d",pst_wpa_assoc_req->auth);
}

/*****************************************************************************
 函 数 名  : cmd_wpa_connect
 功能描述  : 发起关联
 输入参数  :
 输出参数  :
 返 回 值  :
 调用函数  :
 被调函数  :

 修改历史      :
  1.日    期   : 2016年6月29日
    作    者   : 
    修改内容   : 新生成函数

*****************************************************************************/

void cmd_wpa_connect(int argc, char *argv[])
{
    struct wpa_assoc_request wpa_assoc_req;
    unsigned char auth_type[32],key[64];
    unsigned char err;

    if (argc < 2)
    {
        HISI_PRINT_ERROR("wpa_connect: parameter is not valid");
        return;
    }

    memset(&wpa_assoc_req , 0 ,sizeof(struct wpa_assoc_request));

    //get hidden_ssid
    wpa_assoc_req.hidden_ssid=atoi(argv[0]);

    //get ssid
    if (strlen(argv[1]) >= sizeof(wpa_assoc_req.ssid))
    {
        HISI_PRINT_ERROR("wpa_connect: parameter 1 length is not valid");
        return;
    }
    strcpy(wpa_assoc_req.ssid,argv[1]);
    HISI_PRINT_ERROR("wpa_connect: ssid: %s",wpa_assoc_req.ssid);

    //get auth_type
    if (strlen(argv[2]) >= sizeof(auth_type))
    {
        HISI_PRINT_ERROR("wpa_connect: parameter 2 length is not valid");
        return;
    }
    strcpy(auth_type,argv[2]);
    if (!strcmp(auth_type, "open"))
    {
        wpa_assoc_req.auth = WPA_SECURITY_OPEN;
    }
    else if (!strcmp(auth_type, "wep"))
    {
        wpa_assoc_req.auth = WPA_SECURITY_WEP;
    }
    else if (!strcmp(auth_type, "wpa"))
    {
        wpa_assoc_req.auth = WPA_SECURITY_WPAPSK;
    }
    else if (!strcmp(auth_type, "wpa2"))
    {
        wpa_assoc_req.auth = WPA_SECURITY_WPA2PSK;
    }
    else if (!strcmp(auth_type, "wpa+wpa2"))
    {
        wpa_assoc_req.auth = WPA_SECURITY_WPAPSK_WPA2PSK_MIX;
    }
    else
    {
        HISI_PRINT_ERROR("Error! Unknwon Authentication Type: %s",auth_type);
        return;
    }

    HISI_PRINT_ERROR("wpa_connect: Authentication Type = %d",wpa_assoc_req.auth);

    //get key
    if (argc >= 4)
    {
        if (strlen(argv[3]) >= sizeof(wpa_assoc_req.key))
        {
            HISI_PRINT_ERROR("wpa_connect: parameter 3 length is not valid");
            return;
        }
        strcpy(wpa_assoc_req.key, argv[3]);

        HISI_PRINT_ERROR("wpa_connect: Key = %s",wpa_assoc_req.key);

    }

    wpa_connect_interface(&wpa_assoc_req);
}
/*****************************************************************************
 函 数 名  : cmd_wpa_disconnect
 功能描述  : 发起去关联
 输入参数  :
 输出参数  :
 返 回 值  :
 调用函数  :
 被调函数  :

 修改历史      :
  1.日    期   : 2016年6月29日
    作    者   : 
    修改内容   : 新生成函数

*****************************************************************************/
void cmd_wpa_disconnect(int argc, char *argv[])
{
    int l_ret = 0;

    l_ret = wpa_cli_disconnect();
    if (l_ret != 0)
    {
        HISI_PRINT_ERROR("cmd_wpa_disconnect fail.");
    }
}

extern void wifi_debug_shell_cmd_register(void);
extern int keepalive_demo_main(int argc, char *argv[]);
extern int keepalive_demo_set_switch(int argc, char *argv[]);
extern int keepalive_demo_get_lose_tcp_id(void);
extern int hsl_demo_main(void);
extern int aplink_demo_main(void);
extern int hisi_wlan_set_wakeup_ssid_ex(char *ssid,unsigned char channel_num,unsigned short pno_period);
/*****************************************************************************
 函 数 名  :hisi_wlan_shell_set_wakeup_ssid
 功能描述  :设置ssid
 输入参数  :
 输出参数  :
 返 回 值  :
 调用函数  :
 被调函数  :

 修改历史      :
  1.日    期   :2017年02月27日
    作    者   :
    修改内容   : 新生成函数

*****************************************************************************/
void hisi_wlan_shell_set_wakeup_ssid(int argc, unsigned char *argv[])
{
    unsigned int       ret;
    unsigned short     us_pno_period   = 0;
    unsigned char      uc_channel_num  = 0;
    if((argc !=1 && argc != 3) || HISI_NULL == argv[0] || strlen(argv[0]) > MAX_SSID_LEN)
    {
        HISI_PRINT_ERROR("param is invalid,argc:%d,argv[0]== NULL:%d!",argc,(argv[0]== NULL));
        return;
    }

    HISI_PRINT_INFO("hisi_wlan_shell_set_wakeup_ssid ssid:%s \r\n",argv[0]);
    if (argc == 1)
    {
        ret = hisi_wlan_set_wakeup_ssid(argv[0]);
        if(HISI_SUCC == ret)
        {
            HISI_PRINT_INFO("succ to  set ssid");
        }
        else
        {
            HISI_PRINT_ERROR("fail to  set ssid,ret:%d!",ret);
        }
    }
    if (argc == 3)
    {
        uc_channel_num  = atoi(argv[1]);
        us_pno_period   = atoi(argv[2]);
        ret = hisi_wlan_set_wakeup_ssid_ex(argv[0],uc_channel_num,us_pno_period);
        if(HISI_SUCC == ret)
        {
            HISI_PRINT_INFO("succ to  set ssid");
        }
        else
        {
            HISI_PRINT_ERROR("fail to  set ssid,ret:%d!",ret);
        }
    }
    return;
}

/*****************************************************************************
 函 数 名  :hisi_get_wps_ssid_key
 功能描述  :获取WPS关联后的SSID和密码
 输入参数  :
 输出参数  :
 返 回 值  :
 调用函数  :
 被调函数  :

 修改历史      :
  1.日    期   :2017年11月16日
    作    者   :
    修改内容   : 新生成函数

*****************************************************************************/
void hisi_get_wps_ssid_key(void)
{
    char         ac_ssid[33] = {0};
    char         ac_key[65]  = {0};
    unsigned int ul_ssid_len = 0;
    unsigned int ul_key_len  = 0;
    wpa_supplicant_get_wps_ssid_key(ac_ssid,&ul_ssid_len,ac_key,&ul_key_len);
    if (0 != ul_key_len)
    {
        printf("wps:ssid=%s,ssid_len=%d,key=%s,key_len=%d\n",ac_ssid,ul_ssid_len,ac_key,ul_key_len);
    }
    else
    {
        printf("wps:ssid=%s,ssid_len=%d\n",ac_ssid,ul_ssid_len);
    }
}

#ifdef _PRE_WLAN_FEATURE_QUICK_START
extern int hisi_set_psk_demo(void);
void hisi_disable_quick_shell(int argc, char *argv[])
{
    int l_disable_flag;
    l_disable_flag = atoi(argv[0]);
    hisi_disable_quick_start(l_disable_flag);
    return;
}

void hisi_cmd_set_qstart_ssid(int argc, char *argv[])
{
    int     l_ret = -1;
    if (NULL == argv)
    {
        printf("hisi_cmd_set_qstart_ssid::error param\n");
        return;
    }

    l_ret = hisi_set_quick_start_ssid(argv[0], strlen(argv[0]));
    if (0 != l_ret)
    {
        printf("hisi_cmd_set_qstart_ssid::set ssid fail\n");
        return;
    }
}
#endif

/*****************************************************************************
  函 数 名  : cmd_set_wow_pattern
  功能描述  : 强制睡眠netpattern唤醒报文格式的添加API接口
              格式:set_pattern index ip port len buf(wow_pattern 1 192.168.1.1 555 192.168.1.21 666)
  输入参数  : argc :
              argv :
  输出参数  : 无
  返 回 值  : 无
  调用函数  :
  被调函数  :

  修改历史      :

  1.日    期   : 2017年11月25日
    作    者   :
    修改内容   : 新生成函数

*****************************************************************************/
void cmd_set_wow_pattern(int argc, unsigned char *argv[])
{
    unsigned int        ul_src_ipaddr;
    unsigned short      us_src_port;
    unsigned int        ul_des_ipaddr;
    unsigned short      us_des_port;
    unsigned int        ul_netpattern_index;
    unsigned int        ul_netpattern_len = 8;
    int                 l_loop;
    unsigned char       auc_buf[8] = {0x31, 0xD0, 0x15, 0x53, 0xA6, 0x9A, 0x4E, 0x71};
    struct sockaddr_in  serveraddr = {0};
    unsigned int        ul_ret;

    if (1 == argc)
    {
        ul_netpattern_index = atoi(argv[0]);
        ul_ret = hisi_wlan_add_netpattern(ul_netpattern_index, auc_buf, ul_netpattern_len);
    }
    else if (5 == argc)
    {
        ul_netpattern_index = atoi(argv[0]);
        if (0 == inet_aton(argv[1], &serveraddr.sin_addr))
        {
            printf("cmd_set_wow_pattern::inet_aton fail\n");
        }
        ul_src_ipaddr = *(unsigned int *)&serveraddr.sin_addr;
        us_src_port = atoi(argv[2]);
        if (0 == inet_aton(argv[3], &serveraddr.sin_addr))
        {
            printf("cmd_set_wow_pattern::inet_aton fail\n");
        }
        ul_des_ipaddr = *(unsigned int *)&serveraddr.sin_addr;
        us_des_port = atoi(argv[4]);
        ul_ret = hisi_wlan_add_netpattern_ex(ul_netpattern_index, auc_buf, ul_netpattern_len, ul_src_ipaddr, us_src_port, ul_des_ipaddr, us_des_port);
    }
    else
    {
        printf("cmd_set_wow_pattern::unavailable param\n");
        return;
    }

    if (0 != ul_ret)
    {
        printf("cmd_set_wow_pattern::hisi wlan add_netpattern error ret:%d\n", ul_ret);
    }
}

/*****************************************************************************
 函 数 名  : hisi_wlan_add_netpattern
 功能描述  : 清除指定index睡眠netpattern唤醒报文
             格式:cls_pattern index(cls_pattern 1)
 输出参数  : 无
 返 回 值  : 无
*****************************************************************************/
void cmd_cls_wow_pattern(int argc, unsigned char *argv[])
{
    unsigned int        ul_netpattern_index;
    unsigned int        ul_ret;

    if (NULL == argv)
    {
        printf("cmd_cls_wow_pattern::error input\n");
        return;
    }

    ul_netpattern_index = atoi(argv[0]);

    ul_ret = hisi_wlan_del_netpattern(ul_netpattern_index);
    if (0 != ul_ret)
    {
        printf("cmd_cls_wow_pattern::hisi wlan add_netpattern error ret:%d\n", ul_ret);
    }
}

/*****************************************************************************

 函 数 名  :cmd_hisi_log_level_switch
 功能描述  :切换日志打印级别
 输入参数  :
 输出参数  :
 返 回 值  :
 调用函数  :
 被调函数  :

 修改历史      :
  1.日    期   :
    作    者   :
    修改内容   : 新生成函数

*****************************************************************************/
void cmd_hisi_log_level_switch(int argc, char *argv[])
{
    unsigned int ul_level;

    if (1 != argc)
    {
        printf("cmd_hisi_log_level_switch::argc %d is wrong\n", argc);
        return;
    }

    ul_level = atoi(argv[0]);
    if ((ul_level < 0) || (ul_level > 4))
    {
        printf("cmd_hisi_log_level_switch::params %d is wrong\n", ul_level);
        return;
    }
    hisi_log_level_switch(ul_level);
}

static void cmd_get_hisi_wifi_debug_info(int argc, char *argv[])
{
    hisi_wifi_debug_info();
}

static void cmd_netcfg(int argc, char *argv[])
{
    hisi_netcfg(argv[0], argv[1]);
}

/*****************************************************************************
 函 数 名  : hisi_wifi_shell_cmd_register
 功能描述  : 注册wifi shell命令
 输入参数  : oal_void
 输出参数  : 无
 返 回 值  : oal_void
 调用函数  :
 被调函数  :

 修改历史      :
  1.日    期   : 2016年3月22日
    作    者   : 
    修改内容   : 新生成函数

*****************************************************************************/
void hisi_wifi_shell_cmd_register(void)
{
    wifi_debug_shell_cmd_register();
    osCmdReg(CMD_TYPE_EX, "set_macaddr",0, (CMD_CBK_FUNC)hisi_cmd_set_macaddr);
    osCmdReg(CMD_TYPE_EX, "always_tx",  0, (CMD_CBK_FUNC)hisi_cmd_set_always_tx);
    osCmdReg(CMD_TYPE_EX, "always_rx",  0, (CMD_CBK_FUNC)hisi_cmd_set_always_rx);
    osCmdReg(CMD_TYPE_EX, "rx_info",    0, (CMD_CBK_FUNC)hisi_cmd_rx_info);
    osCmdReg(CMD_TYPE_EX, "dc_test",    3, (CMD_CBK_FUNC)hisi_cmd_dc_test);
    osCmdReg(CMD_TYPE_EX, "set_country",  0, (CMD_CBK_FUNC)hisi_cmd_set_country);
    osCmdReg(CMD_TYPE_EX, "get_country",  0, (CMD_CBK_FUNC)hisi_cmd_get_country);
    osCmdReg(CMD_TYPE_EX, "get_channel",  0, (CMD_CBK_FUNC)hisi_cmd_get_channel);
    osCmdReg(CMD_TYPE_EX, "get_station",    0, (CMD_CBK_FUNC)hisi_cmd_get_station);
    osCmdReg(CMD_TYPE_EX, "set_pm_switch",  0, (CMD_CBK_FUNC)hisi_cmd_set_pm_switch);
    osCmdReg(CMD_TYPE_EX, "start_hapd",     0, (CMD_CBK_FUNC)cmd_start_hapd);
    osCmdReg(CMD_TYPE_EX, "stop_hapd",      0, (CMD_CBK_FUNC)cmd_stop_hapd);
    osCmdReg(CMD_TYPE_EX, "wpa_start",      0, (CMD_CBK_FUNC)cmd_wpa_start);
    osCmdReg(CMD_TYPE_EX, "wpa_stop",       0, (CMD_CBK_FUNC)cmd_wpa_stop);
    osCmdReg(CMD_TYPE_EX, "wpa_scan",       0, (CMD_CBK_FUNC)cmd_wpa_scan);
    osCmdReg(CMD_TYPE_EX, "wpa_scan_result",0, (CMD_CBK_FUNC)cmd_wpa_scan_results);
    osCmdReg(CMD_TYPE_EX, "wpa_connect",    5, (CMD_CBK_FUNC)cmd_wpa_connect);
    osCmdReg(CMD_TYPE_EX, "wpa_disconnect", 0, (CMD_CBK_FUNC)cmd_wpa_disconnect);
    osCmdReg(CMD_TYPE_EX, "loglevel", 0, (CMD_CBK_FUNC)cmd_hisi_log_level_switch);
    //osCmdReg(CMD_TYPE_EX, "hilink", 0, (CMD_CBK_FUNC)hilink_demo_main);
    osCmdReg(CMD_TYPE_EX, "tcp_build", 2, (CMD_CBK_FUNC)keepalive_demo_main);
    osCmdReg(CMD_TYPE_EX, "tcp_switch", 0, (CMD_CBK_FUNC)keepalive_demo_set_switch);
    osCmdReg(CMD_TYPE_EX, "tcp_lose_id", 0, (CMD_CBK_FUNC)keepalive_demo_get_lose_tcp_id);
    osCmdReg(CMD_TYPE_EX, "hisilink", 0, (CMD_CBK_FUNC)hsl_demo_main);
    osCmdReg(CMD_TYPE_EX, "wow_set_ssid", 0, (CMD_CBK_FUNC)hisi_wlan_shell_set_wakeup_ssid);
    osCmdReg(CMD_TYPE_EX, "wow_clear_ssid", 0, (CMD_CBK_FUNC)hisi_wlan_clear_wakeup_ssid);
    osCmdReg(CMD_TYPE_EX, "set_pattern",    5, (CMD_CBK_FUNC)cmd_set_wow_pattern);
    osCmdReg(CMD_TYPE_EX, "cls_pattern",    1, (CMD_CBK_FUNC)cmd_cls_wow_pattern);
    osCmdReg(CMD_TYPE_EX, "aplink", 0, (CMD_CBK_FUNC)aplink_demo_main);
    osCmdReg(CMD_TYPE_EX, "wps_ssid_key", 0, (CMD_CBK_FUNC)hisi_get_wps_ssid_key);
    osCmdReg(CMD_TYPE_EX, "wpa_chl_scan",       0, (CMD_CBK_FUNC)cmd_wpa_channel_scan);
    osCmdReg(CMD_TYPE_EX, "netcfg",         2, (CMD_CBK_FUNC)cmd_netcfg);
    osCmdReg(CMD_TYPE_EX, "wifi_debug",     0, (CMD_CBK_FUNC)cmd_get_hisi_wifi_debug_info);
#ifdef _PRE_WLAN_FEATURE_QUICK_START
    osCmdReg(CMD_TYPE_EX, "enable_qstart",  0, (CMD_CBK_FUNC)hisi_enable_quick_start);
    osCmdReg(CMD_TYPE_EX, "disable_qstart", 1, (CMD_CBK_FUNC)hisi_disable_quick_shell);
    osCmdReg(CMD_TYPE_EX, "qstart_set_ssid", 1, (CMD_CBK_FUNC)hisi_cmd_set_qstart_ssid);
#if (_HI113X_SW_VERSION == _HI113X_SW_DEBUG)
    osCmdReg(CMD_TYPE_EX, "set_psk",        0, (CMD_CBK_FUNC)hisi_set_psk_demo);
#endif
#endif
}

#ifdef __cplusplus
    #if __cplusplus
        }
    #endif
#endif

